"""
 yield 和 return的区别
   yield 一直会返回值 不会主动终止函数  常用生成器当中
   return 只会返回一次值， 会主动终止函数
"""
#定义一个斐波那契数列的生成器
def fib(n):
    a,b = 0 ,1
    for _ in range(n):
        a,b = b,a+b
        #return a # 1
        yield a # 返回的是该循环内所有 a 表示的值
#生成器的使用  yield 和 next 生成器本身就是一个函数，只不过返回值从return 变成 yield(与循环配合使用)
def gen1():
    c = fib(10)
    ll = list(c)  # 将生成器转换成列表
    print(ll, type(ll))
    print(c, type(c))  # 表示 该生成器的所有返回值 c的类型就是一个生成器 理解是一个列表
    for e in c:
        print(e, end=",")  # 1,1,2,3,5,8,13,21,34,55

    # next 一般和生成器一起使用 每执行一次 会返回一个yield的结果值
    ff = fib(10)  # 将函数赋值给一个遍历 ，目的是每次调用不会重新定义
    f = next(ff)  # 每执行一次，就可以获取一次yield返回的结果值
    print("next的返回值", f)  # 1
    f = next(ff)
    print("next的返回值", f)  # 1
    f = next(ff)
    print("next的返回值", f)  # 2
    f = next(ff)
    print("next的返回值", f)  # 3
    f = next(ff)
    print("next的返回值", f)  # 5
    f = next(ff)
    print("next的返回值", f)  # 8

def gen2():
    #利用生成式 去创建一个 1-10的二次方的列表
    list2 = [ x * x for x in range(1,11) ] # x = 1,2,3,4,5,6,7,8,9,10
    print(list2)

    #利用生成式 去创建 A1 -- G5的 生成器 --》 元组
    tuple2 = ( m+n  for m in 'ABCDEFG' for n in '12345' )# m= A , B, C ---G   n=1,2,3,4,5
    print(tuple(tuple2))

if __name__ == '__main__':
    #gen1()
    gen2()
